\section{8. SQL kode afviklet på databasesiden: Stored Procedure, Function, Trigger og View}
\begin{center}
\line(1,0){500}
\end{center}

\subsection{Stored Procedures}
\begin{itemize}
    \item En gemt procedure, der som regel skal afvikles ofte
    \item Afvikles på serveren, ikke klienten 
    \item Kan returnere 0, 1 eller flere værdier
    \item Transaktioner kan bruges i en SP
    \item Kan have både input og output parameter
    \item Kan kalde en funktion
    \item Kan ikke bruges inline med SQL statement
\end{itemize}
\begin{lstlisting}
CREATE PROCEDURE spSelectStudent (@Course INTEGER, @Grade INTEGER) 
AS 
SELECT * FROM Students 
WHERE Std_Course=@Course AND Std_Grade <= @Grade 
\end{lstlisting}

\subsection{(User Defined) Functions}
\begin{itemize}
    \item En funktion skal returnere en værdi
    \item Benyttes som en funktion på databasen, kan ikke kaldes direkte fra f.eks. ADO.NET (Skal være en del af statement)
    \item Benyttes hvis der skal udregnes en returværdi
    \item Ingen ændringer på databasen kan foretages i en funktion (INSERT, UPDATE, DELETE)
    \item Der kan ikke foretages transaktioner
    \item Kan ikke kalde en SP
    \item Kan kun have input parameter
    \item Kan bruges inline med SQL statements og man kan benytte join på funktionen hvis den returnerer et sæt
    \item Scalar - Returnerer værdier 
    \item Other - Returnerer sæt
    \item Kan skabe performance problemer
    \item Der findes indbyggede funktioner i SQL, f.eks. MIN(), MAX(), SUM()
\end{itemize}
\begin{lstlisting}
CREATE FUNCTION fx_SumTwoValues
( @Val1 int, @Val2 int )
RETURNS int
AS
BEGIN
  RETURN (@Val1+@Val2)
END
\end{lstlisting}

\subsection{(DML) Triggers}
Triggers kan ske på:
\begin{itemize}
    \item UPDATE, DELETE, INSERT, DROP TABLE, CREATE TABLE, ALTER TABLE
    \item Kaldes implicit af serveren selv
\end{itemize}

\begin{lstlisting}
CREATE TRIGGER CopyName
ON Person
FOR INSERT
AS
UPDATE Person SET CopyOfName = name
\end{lstlisting}

\subsection{Views}
\begin{itemize}
    \item Et view er en sammensætning af tabeller / attributter dannet af et SELECT statement
    \item "Virtuel tabel" der præsenterer data i et ønsket format
    \item Er midlertidige, man rydder op efter sig 
\end{itemize}

\begin{lstlisting}
CREATE VIEW bilCount (total) AS SELECT count(*) FROM Bil;
SELECT * FROM bilCount;
DROP VIEW bilCount;
\end{lstlisting}